package com.cy.pj.sys.service.impl;

import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

import com.cy.pj.common.bo.Node;
import com.cy.pj.common.bo.SysUserMenu;
import com.cy.pj.common.exception.ServiceException;
import com.cy.pj.sys.dao.SysMenuDao;
import com.cy.pj.sys.dao.SysRoleMenuDao;
import com.cy.pj.sys.dao.SysUserRoleDao;
import com.cy.pj.sys.pojo.SysMenu;
import com.cy.pj.sys.service.SysMenuService;


@Service
public class SysMenuServiceImpl implements SysMenuService {
	@Autowired
	private SysMenuDao sysMenuDao;
	@Autowired
	private SysRoleMenuDao sysRoleMenuDao;
	@Autowired
	private SysUserRoleDao sysUserRoleDao;
	
	@Cacheable(value="menuCache")//此注解描述的方法为一个缓存切入点方法,此方法在执行之前会从缓存取数据,缓存没有数据则从数据库查询
	@Override
	public List<Map<String, Object>> fundObjects() {
		return sysMenuDao.findObjects();
	}
	///beforeInvocation -> 清缓存在方法开始执行(true)还是方法结束执行(false),allEntries是否删除全部?true是,false否
	@CacheEvict(value = "menuCache" ,allEntries = true,beforeInvocation = false)//清除缓存中的内容
	@Override
	public int deleteObject(Integer id) {
		//1.进行参数校验
		if(id==null || id<1) {
			throw new IllegalArgumentException("请先删除子菜单!");
		}
		//2.查询是否有子菜单
		int childCount = sysMenuDao.getChildCount(id);
		//3.判断如果有子菜单
		if(childCount>0) {
			//抛出异常
			throw new ServiceException("请先删除子菜单!");
		}
		//4.删除表关系记录
		sysRoleMenuDao.deleteObjectByMenuId(id);
		//5.删除菜单
		int rows = sysMenuDao.deleteObject(id);
		//6.判断是否有行被删除
		if(rows==0) {
			//没有的话可能已经被其他用户删除了
			throw new ServiceException("记录可能不存在!");
		}
		//返回行数
		return rows;
	}

	@Override
	public List<Node> findZtreeMenuNodes() {
		return sysMenuDao.findZtreeMenuNodes();
	}
	@CacheEvict(value = "menuCache" ,allEntries = true,beforeInvocation = false)//清除缓存中的内容
	@Override
	public int saveObject(SysMenu sysMenu) {
		int rows = sysMenuDao.insertObject(sysMenu);
		return rows;
	}
	@CacheEvict(value = "menuCache" ,allEntries = true,beforeInvocation = false)//清除缓存中的内容
	@Override
	public int updateObject(SysMenu sysMenu) {
		int rows = sysMenuDao.updateObject(sysMenu);
		return rows;
	}
	@Override
	public List<SysUserMenu> findUserMenusByUserId(Integer id) {
		//1.进行参数的校验
		if(id==null||id<1)
			throw new IllegalArgumentException("角色有误");
		//2.查询用户id对应的菜单id
		List<Integer> menuIds = sysUserRoleDao.findMenuIdsByUserIds(id);
		if(menuIds==null||menuIds.size()<1)
			throw new ServiceException("此用户暂未改绑定任何菜单权限!");
		//3.查询菜单ids查询用户有访问权限对应的菜单
		List<SysUserMenu> menu = sysMenuDao.findMenusByIds(menuIds);
		if(menu==null||menu.size()<1)
			throw new ServiceException("查询菜单信息出错!");
		return menu;
	}

}
